最近在寫React時發現很多時候變數明明被改變了,卻要用const來宣告而不是用let,究竟原因是什麼呢?今日的套餐讓我們來嚐嚐ES5的var與E6的let、conset的差別吧!
簡單來說ES6宣告變數上比較嚴格,新增了塊級作用域,將全域作用域棄用:
全域作用域:
1.削弱了程式的彈性,盡量避免使用
2.只能做簡單的事情,複雜的事情會事倍功半
塊級作用域:
1.用大括號{}的情況下成立,沒有的話會報錯
2.外層無法讀取內層作用域的變數
ES5變數var
1.全域作用域
2.存在變數提升的現象,也就是在宣告之前可以使用,但值為undefined
console.log(delicious) //undefined
var delicious = 'eat'
3.缺點:以下的範例中,變數i是透過var宣告,在全域範圍內都有效,所以每次的循環,新的值i都會覆蓋掉舊值
for (var i = 0; i < 5; ++i) {
setTimeout(function () {
console.log(i); // 輸出 '5' 五次
}, 100);
}
ES6的 let 與 const
都有個共通特性是
1.不可重複宣告
2.作用域只在宣告的塊級作用域內有效
3.不存在變數提升,只能在宣告之後使用
若在定義變數之前使用該變數則會拋出ReferenceError錯誤
p = 3; // ReferenceError
let p;
let變數:
1.需要再指定值的情況。
2.用於for迴圈
for (let i = 0; i < 5; ++i) {
setTimeout(function () {
console.log(i); // 輸出 0, 1, 2, 3, 4
}, 100);
}
const常數:
1.宣告時就立即給予值,不可之後再改變值(修改會報錯)。
實際上並不是變數的值不能改變,而是變數指向的內存位址不能被改變
const a = [];
a.push('Java'); // 可執行,此时a為['Java']
a = ['script']; // error
以上是今天的餐點內容,如有錯誤還望各位包含與提出更正,在此先感謝一鞠躬